"""
@Author  : 康帅
@Time    : 2021/3/22 14:34
@Function: 使用isinstance（）来判断一个对象是否为Iterable对象或Iterator对象
"""

from collections import Iterable, Iterator


def fibonacci(max_num):
    """ 斐波那契数列的生成器 """
    a = b = 1
    for i in range(max_num):
        yield a
        a, b = b, a + b


"""
Iterator对象可以被next()函数不断调用并返回下一个值，直到最后抛出StopIteration错误，表示无法继续返回下一个值。
Iterable对象不能被next()函数调用，可以用iter()函数将Iterable对象转成Iterator对象
"""

if __name__ == '__main__':
    """
    1.生成器既是Iterable对象，也是Iterator对象
    2.列表（list）、字典（dict）、元组（tuple）、字符串是Iterable对象，
    却不是Iterator对象；集合（set）既是Iterable对象，也是Iterator对象
    """

    print("是否为Iterable对象：")
    print(isinstance([], Iterable))
    print(isinstance({}, Iterable))
    print(isinstance((1, 2, 3), Iterable))
    print(isinstance(set([1, 2, 3]), Iterable))
    print(isinstance("string", Iterable))
    print("是否为Iterator对象：")
    print(isinstance([], Iterator))
    print(isinstance({}, Iterator))
    print(isinstance((1, 2, 3), Iterator))
    print(isinstance(set([1, 2, 3]), Iterable))
    print(isinstance("string", Iterator))
    print()

    print("将Iterable对象转成Iterator对象")
    data_list = [1, 2, 3]
    iter_data = iter(data_list)
    print(next(iter_data))
    print(next(iter_data))
    print(next(iter_data))
    print()

    print("next()遍历迭代器元素")
    fib = fibonacci(4)
    print(next(fib))
    print(next(fib))
    print(next(fib))
    print(next(fib))
    print(next(fib))
